#include <stdio.h>
#include <malloc.h>
typedef int ElemType;

typedef struct Node{
    ElemType data;
    struct Node *next;
}Node, *LinkList;

void initList(LinkList *L){
    *L=(LinkList) malloc(sizeof (Node));
    (*L)->next=NULL;
}

void insertend(LinkList *L,ElemType n){
    Node  *newNode=(LinkList) malloc(sizeof (LinkList));
    newNode->data=n;
    newNode->next=NULL;
    Node *r;
    r = *L;
    while(r->next!=NULL){
        r=r->next;
    }
    r->next=newNode;
}

//计算链表中元素的个数
int  listLength(LinkList *L){
    if(*L==NULL){
        printf("这是一张空表");
    }
    int i = 0;
    Node *p=(*L)->next;
    while(p!=NULL){
        i++;
        p=p->next;//更新指针
    }
    return i;
}

//遍历表中的每一个元素
void printlist(LinkList *L){
    if(*L==NULL){
        printf("这是一张空表");
    }
    Node *p;
    p=(*L)->next;
    while(p!=NULL){
        printf("%d\n",p->data);
        p=p->next;//更新指针
    }
}

//头插
void insertFront(LinkList *L,ElemType n){
    Node *newNode=(LinkList) malloc(sizeof (LinkList));
    newNode->data=n;
    newNode->next=(*L)->next;
    (*L)->next=newNode;
}

//随插
void insert(LinkList *L,int por,ElemType n){
    if(por<=0||por> listLength(L)+1){
        printf("插入的位置不合法");
    }
    Node *newNode=(LinkList) malloc(sizeof (LinkList));
    newNode->data=n;
    Node *p=*L;
    for(int i=1;i<por;i++){
        p=p->next;
    }
    newNode->next=p->next;//新节点指向p的下一个节点
    p->next=newNode;//p指向新的节点
}

//删除任意位置的节点
void del(LinkList *L,int por){
    if(*L==NULL||(*L)->next==NULL){
        printf("这是一张空表，无法进行删除");
    }
    Node *p=*L;
    for (int i = 0; i < por; ++i) {
        p=p->next;
    }
    Node *del=p->next;//待删除的节点
    p->next=del->next;//待删除的前一个节点的指针指向待删除的前一个节点
    free(del);//释放内存
    del=NULL;
}
int main(){
    LinkList list;
    initList(&list);
    insertend(&list,2);
    insertend(&list,3);
    insertFront(&list,1);
    insert(&list,2,5);
    printf("%d  ^-^ \n", listLength(&list));
    printlist(&list);
    return 0;
}